1、 感知机是什么?

感知机接收多个输入信号,输出一个信号。直观讲来,感知机类似数学上的“函数”,但是感知机的所有变量取值只有0和1。

可以假设函数z = ux+ vy,这里的x、y为自变量,u、v为权重(权重的取值是全体实数),并且设定阈值A,当ux+ vy > A时z的值为1,否则为0.

2、 用感知机表示简单逻辑电路

1) 与门

把与门考虑成感知机:以z = ux+ vy(阈值为A)为例,可以认为它是一个(u, v, A) = (1, 1, 1.5)的感知机(当然还有很多其他取值方式)

2) 与非门和或门

把与非门考虑成感知机:以z = ux+ vy(阈值为A)为例,可以认为它是一个(u, v, A) = (-1, -1, -1.5)的感知机(其实只要把与门的参数取值全部取反就可以)
同样的,或门可以把参数设置为(u, v, A) = (1, 1, 0.8)

3、 感知机的实现

1)简单的与门

def AND(x, y):
    u, v, A = 1, 1, 1.5
    tmp = u * x + v * y
    if tmp > A:
        return 1
    return 0

def main():
    print(AND(0, 0)) # 输出0
    print(AND(1, 0)) # 输出0
    print(AND(1, 1)) # 输出1
    print(AND(0, 1)) # 输出0
main()

2) 导入权重和偏置

考虑最开始的感知机u x+ v y > A, 这个式子也可以表示为u x+ v y - A > 0. 所以也可以使用如下方式实现感知机:
z = u x+ v y + b, 当u x+ v y + b > 0时z取1, 否则取0
这里的b称为偏置

下面使用NumPy实现感知机

import numpy as np
def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([1, 1])# 权重
    b = -1.5 # 偏置
    if np.sum(x * w) + b > 0:
        return 1
    return 0

4、感知机的局限性及解决

1)问题:简单感知机能实现异或门吗?

答案时不能。感知机的表达式是线性的。而异或门的函数无法用线性表示。
但是感知机可以叠加使用,“多层感知机”就可以实现异或门

3) 异或门的多层感知机实现

由逻辑电路知识,异或门可以由与门、或门、与非门搭配实现。

import numpy as np
def AND(x1, x2): # 与门
    x = np.array([x1, x2])
    w = np.array([1, 1])# 权重
    b = -1.5 # 偏置
    if np.sum(x * w) + b > 0:
        return 1
    return 0
def NAND(x1, x2): # 与非门
    x = np.array([x1, x2])
    w = np.array([-1, -1])# 权重
    b = 1.5 # 偏置
    if np.sum(x * w) + b > 0:
        return 1
    return 0
def OR(x1, x2): # 或门
    x = np.array([x1, x2])
    w = np.array([1, 1])# 权重
    b = -0.5 # 偏置
    if np.sum(x * w) + b > 0:
        return 1
    return 0
def XOR(x1, x2): # 异或门
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

def main():
    print(XOR(0, 0)) #输出0
    print(XOR(0, 1)) #输出1
    print(XOR(1, 0)) #输出1
    print(XOR(1, 1)) #输出0

main()